// #include<vector>
// #include<limits>
// #include<cstddef>
// #include<iostream>
// #include<sstream>
// #include<map>
// #include<algorithm>
// #include<tuple>
// #include<unordered_map>
// #include<functional>
// #include<memory>
// using namespace std;

// typedef std::tuple<int,int> keyT;
// struct key_hash : public std::unary_function<keyT, std::size_t>{
//     std::size_t operator()(const keyT& k) const {
//         return std::get<0>(k) ^ std::get<1>(k);
//     }
// };
// struct key_equal : public std::binary_function<keyT, keyT, bool>{
//     bool operator()(const keyT& v0, const keyT& v1) const{
//         return std::get<0>(v0) == std::get<0>(v1) && std::get<1>(v0) == std::get<1>(v1);
//     }
// };
// typedef std::unordered_map<const keyT, int, key_hash, key_equal > map_t;

// //1 2 3 理科 连续两天
// //每天开放的  最多去几天 图书馆
// class ChangeWorld{
// public:
//     map_t cache;
//     std::shared_ptr<vector<int> > openData;
//     int MaxGo(int startPos, int lastGo){
//         if(startPos >= openData->size()) return 0;
//         auto key = std::make_tuple(startPos, lastGo);
//         if(cache.find(key) != cache.end()) return cache[key];

//         auto td = (*openData)[startPos];
//         int maxGoD = 0;
//         for(auto i = 0; i < 4; i++){
//             auto off = 1 << i;
//             if((lastGo&off) > 0) continue;//去过了
//             if((td&off) > 0){//可以去
//                 auto t1 = 1+MaxGo(startPos+1, off);//去
//                 // auto t2 = MaxGo(startPos+1, 0);//不去
//                 maxGoD = max(t1, maxGoD);
//             }
//         }
//         auto t2 = MaxGo(startPos+1, 0);
//         maxGoD = max(maxGoD, t2); //宅家
//         cache[key] = maxGoD;
//         return maxGoD;
//     }
// };
// int main(int, char**) {
//     string nn;
//     getline(cin, nn);
//     auto nv = stoi(nn);

//     // vector<string> dt{
//     //     "1 0 0 0",
//     //     "0 1 0 0",
//     //     "0 0 1 0",
//     // };
//     auto vec = std::make_shared<vector<int>>();
//     for(auto i = 0; i < nv; i++){
//         string data;
//         getline(cin, data);
//         std::stringstream iss(data);
//         std::vector<int> allTok;
//         std::string token;
//         while(std::getline(iss, token, ' ')){
//             allTok.push_back(std::stoi(token));
//         }
//         auto of = 0;
//         for(auto j = 0; j < 4; j++){
//             of |= allTok[j] << j;
//         }
//         vec->push_back(of);
//     }
//     ChangeWorld cw;
//     cw.cache.reserve(vec->size()*4);
//     cw.openData = vec;
//     auto d = cw.MaxGo(0, 0);
//     cout << d << endl;

// }